let express=require('express')
let Router=express.Router()
// 导出Router
module.exports=Router
let query=require('./db')



// 导入加密模块，是内置模块，不需要安装
let crypto = require('crypto')

// 导入multer multer 库来处理文件上传和存储
let multer = require('multer')
// 导入path
let path = require('path')
const { log } = require('console')
// 设置配置 
// 接收一个对象作为参数，该对象包含用于指定文件保存位置和文件命名的方法
let storage = multer.diskStorage({
    // 指定了文件保存的路径
    destination: path.join(__dirname, '../static/images'),
    // 用于生成文件名的回调函数，
    filename: (req, file, cb) => {
        // 获取上传文件的扩展名
        let ext = path.extname(file.originalname)
        // 这行代码将生成的文件名作为回调函数的第二个参数传递给 cb，完成文件名的设定。
        cb(null, file.fieldname + '-' + Date.now() + ext)
    }
})
// 使用配置
// 创建一个 multer 中间件实例，并将配置选项 storage 传入其中。这样创建的 upload 对象可以用于处理文件上传操作
let upload = multer({
    storage
})


// 登录接口
Router.post('/login',async(req,res)=>{
    let {
        username,
        password,
        type
    } = req.body;
    console.log(password,'login');
   try {
    // 把密码加密后再去查询用户登录
    let md5 = crypto.createHash('md5')
    md5.update(password)
    let newPassword = md5.digest('hex')
    // 查询用户
    let data = await query(`select * from qguser where user_name='${username}' and pass_word='${newPassword}';`);
    // 如果根据用户名和密码能查询到数据则说明登录成功，否则登录失败
    // 当查询不到数据的时候 data的值为一个空数组
    if (data.length == 0) {
        res.send({
            code: 400,
            msg: '用户名或者密码错误'
        })
        return;
    }
    // 登录成功 把用户信息存储在session
    req.session.info={
        ...data[0]
    },
    req.session.isLogin=true
    res.send({
        code:200,
        msg:'请求成功了a',
        type
    })
   } catch (error) {
    console.log(error);
    res.send({
        code: 400,
        msg: '请求出错'
    })
   }
})
// 获取用户信息接口 在登录后才能请求,检测是否已经登录
Router.get('/me',async(req,res)=>{
    // 功能完成之后把这句代码打开
     let {user_id}=req.session.info
      
    // let user_id=2
    try {
       
        let data=await query(`select * from qguser where user_id=${user_id}`)
        let info={
            ...data[0]
        }
        // 把密码删除再返回
        delete info.pass_word 
        if(!data[0]){
            res.send({
                code:400,
                msg:'没有该用户',
                ...info
            })
            return
        }
        res.send({
            code:200,
            msg:'查询成功',

            ...info
        })
    } catch (error) {
        
        res.send({
            code:400,
            msg:'数据库操作错误'
        })
    }
   
})
// 退出登录的接口
Router.get('/out',(req,res)=>{
     //注销session
     req.session.destroy(function(err){
        res.send("退出登录！"+err);
    });
})
// 注册的接口
Router.put('/register', async (req, res) => {
    let {
        username,
        password,
        type
    } = req.body

    // 创建加密方式 为md5加密方式
    let md5 = crypto.createHash('md5')
    md5.update(password);
    // 签名认证之后把密码导出
    let newPassword = md5.digest('hex');
    try {

        await query(`insert into qguser values(${null},'${username}','${newPassword}',${null},${null},${null},${null},${null},${type});`)
        res.send({
            code: 200,
            msg: '注册成功'
        })
    } catch (err) {
        res.send({
            code: 400,
            msg: '注册失败1'
        })
    }
})
// 检测用户是否存在的数据接口
// /api/user/check/用户名
Router.get('/check/:username',async (req, res) => {
    let { username } = req.params;
    try {
        let data = await query(`select * from qguser where user_name='${username}';`);
        // 存不存在都会返回数组
        // 存在则数组有数据
        // 不存在:数组为空数组
        if (data.length == 0) {
            res.send({
                code: 200,
                msg:'正常注册'
            })
            return
        }
        res.send({
            code: 400,
            msg:'用户名已经存在'
        })

    } catch (error) {
        res.send({
            code: 400,
            msg:error
        })
    }
})
// 修改头像的接口
Router.post('/updateAvatar',upload.single('avatar'),async(req,res)=>{
    let {user_id}=req.session.info
    let file = req.file
    let sql=''
    if (file) {
        let imgurl = `http://localhost:9091/images/` + file.filename;
        sql = `update qguser set avatar='${imgurl}' where user_id=${user_id}`;
    } else {
        return
    }
    try {
       let data= await query(sql);
        res.send({
            code: 200,
            msg:'添加成功',
            data
        })
    } catch (error) {
        res.send({
            code: 400,
            msg:error
        })
    }

})
// 修改背景的接口
Router.post('/updateBg',upload.single('bg'),async(req,res)=>{
    let {user_id}=req.session.info
    let file = req.file
    let sql=''
    if (file) {
        let imgurl = `http://localhost:9091/images/` + file.filename;
        sql = `update qguser set bg='${imgurl}' where user_id=${user_id}`;
    } else {
        return
    }
    try {
       let data= await query(sql);
        res.send({
            code: 200,
            msg:'添加成功',
            data
        })
    } catch (error) {
        res.send({
            code: 400,
            msg:error
        })
    }

})
// 获取用户对应发表的文章
Router.get('/userWenZhang',async(req,res)=>{
    let {user_id}=req.session.info
    console.log(user_id);
   
    try {
        let data=await query(`select * from wenZhang `)
        res.send({
            code:200,
            msg:'查询成功',
            data
        })
    } catch (error) {
        res.send({
            code:400,
            msg:'数据库操作有误',
        })
    }
})
// 修改用户信息的接口
// 涉及到文件的传递，不能用get请求
// upload.single()处理单个文件的中间件
// upload.array()处理多个文件的中间件

// 指定只处理名为 'avatar' 的文件上传
Router.post('/updateUser', upload.single('avatar'), async (req, res) => {
    // 文件的传递，不像之前json,字符串，数字那样处理，得用插件（multer）
    // multer 这个就是帮助我们处理formdata格式的参数
    // 文件处理方到 req.file 中
    // 普通数据类型处理放到 req.body中
    let file = req.file
    console.log(file, 'file');
    let {
        name,
        introduce,
        email,
        tel
    } = req.body
    let { user_id } = req.session.info;
    let sql = '';
    // 如果传来的有文件
    if (file) {
        
        let imgurl = `http://localhost:9091/images/` + file.filename;
        sql = `update qguser set user_name='${name}',tel='${tel}',email='${email}',introduce='${introduce}',avatar='${imgurl}' WHERE user_id=${user_id};`;
    } else {
        
        sql = `update qguser set user_name='${name}',tel='${tel}',email='${email}',introduce='${introduce}' WHERE user_id=${user_id};`;
    }
    try {
        
        await query(sql);
        res.send({
            code: 200,
            msg:'修改成功'
        })
    } catch (error) {
        res.send({
            code: 400,
            msg:error
        })
    }
})
// 验证密码
Router.get('/checkMiMa',async(req,res)=>{
    let {oldMiMa}=req.query
    let {user_id}=req.session.info
     // 把密码加密后再去查询用户登录
     let md5 = crypto.createHash('md5')
     md5.update(oldMiMa)
     let newPassword = md5.digest('hex')
     console.log(oldMiMa);
    try {
        let data=await query(`select * from qguser where pass_word='${newPassword}' and user_id=${user_id}`)
      
        if(data.length!=0){
            res.send({
                code:200,
                msg:'查询成功'
            })
        }else{
            res.send({
                code:400,
                msg:'原密码错误'
            })
        }
       
    } catch (error) {
        console.log(`select * from qguser where pass_word='${newPassword}' and user_id=${user_id}`);
        res.send({
            code:400,
            msg:'数据库操作错误'
        })
    }
})
// 修改密码
Router.post('/updateMiMa',async(req,res)=>{
    let {newpassword}=req.body
    let {user_id}=req.session.info
     // 创建加密方式 为md5加密方式
     let md5 = crypto.createHash('md5')
     md5.update(newpassword);
     // 签名认证之后把密码导出
     let Password = md5.digest('hex');
    try {
        await query(`update qguser set pass_word='${Password}' where user_id=${user_id}` )
        res.send({
            code:200,
            msg:'修改成功', 
        })
    } catch (error) {
        res.send({
            code:400,
            msg:'数据库操作错误'
        })
    }
})
// 获取全部非管理员用户
Router.get('/getUser',async(req,res)=>{
    let {type}=req.session.info
    if(type==2){
        try {
            let data=await query(`select * from qguser where type=1 `)
            data.forEach(item => {
                delete item.pass_word 
            });
            console.log(data);
            res.send({
                code:200,
                msg:'查询成功',
                data
            })
        } catch (error) {
            res.send({
                code:400,
                msg:'数据库操作错误'
            })
        }
    }else{
        res.send({
            code:400,
            msg:'非管理员，无权限'
        })
    }
})
Router.delete('/delete/:userid',async(req,res)=>{
    let {type}=req.session.info
    let {userid}=req.params
    if(type==2){
        try {
            console.log(`delete from qguser where user_id=${userid}`);
            let data=await query(`delete from qguser where user_id=${userid}`)
            res.send({
                code:200,
                msg:'删除成功',
            })
        } catch (error) {
            res.send({
                code:400,
                msg:'数据库操作错误'
            })
        }
    }else{
        res.send({
            code:400,
            msg:'非管理员，无权限'
        })
    }
})